/**
在 Koa 中， ctx （上下文）是一个非常重要的对象，它包含了 HTTP 请求和响应的所有信息。 ctx  是 Koa 中间件的第一个参数，提供了一系列方法和属性，方便开发者进行请求处理和响应返回。
  1.  ctx  的结构
  ctx  对象包含请求（Request）和响应（Response）相关的信息，主要包括以下几个部分：

  -  ctx.request : 包含有关请求的信息
  -  ctx.response : 包含有关响应的信息
  -  ctx.state : 用于存储应用程序的状态信息
  -  ctx.app : 当前 Koa 应用的实例

  2.  ctx.request 
  ctx.request  对象包含了与 HTTP 请求相关的信息，包括：

  -  ctx.request.method : 请求的方法（如 GET、POST 等）
  -  ctx.request.url : 请求的 URL
  -  ctx.request.headers : 请求的头部信息
  -  ctx.request.body : 请求的主体数据（需要中间件支持，如  koa-bodyparser ）
  -  ctx.request.query : 查询参数，返回一个对象
  -  ctx.request.params : 路由参数，返回一个对象（如果使用了路由中间件）

  3.  ctx.response 
  ctx.response  对象用于设置响应的信息，包括：

  -  ctx.response.status : 设置响应的状态码
  -  ctx.response.body : 设置响应的主体内容
  -  ctx.response.headers : 设置响应的头部信息
  -  ctx.response.type : 设置响应的内容类型（如  application/json ）

  4.  ctx.state 
  ctx.state  是一个用于存储应用程序状态的对象，可以在中间件之间共享数据。通常用于存储用户信息、权限等。

  5.  ctx.app 
  ctx.app  是当前 Koa 应用的实例，允许访问应用的全局配置和方法。

  6. 示例代码
  以下是一个使用  ctx  的简单示例：
  const Koa = require('koa');
  const app = new Koa();

  app.use(async (ctx, next) => {
      // 处理请求
      console.log(Request Method: ${ctx.request.method});
      console.log(Request URL: ${ctx.request.url});
      
      // 设置响应
      ctx.response.status = 200;
      ctx.response.body = {
          message: 'Hello, Koa!',
          query: ctx.request.query,
          state: ctx.state
      };
      
      await next();
  });

  app.listen(3000, () => {
      console.log('Server is running on http://localhost:3000');
  });
  总结
  ctx  对象在 Koa 中扮演了核心角色，它封装了请求和响应的所有细节，使得开发者能够方便地进行 Web 应用开发。理解  ctx  的结构和使用方法是掌握 Koa 的关键。通过合理利用  ctx ，可以有效地处理请求、构建响应和共享状态信息。
 */
const Koa = require("koa");

const app = new Koa(); // 创建koa实例

app.use((ctx, next) => {
  // 1. 请求对象
  console.log(ctx.request); // 请求对象: Koa封装的请求对象
  console.log(ctx.req); // 原生的请求对象: Node.js提供的请求对象

  // 2. 响应对象
  console.log(ctx.response); // 响应对象: Koa封装的响应对象
  console.log(ctx.res); // 原生的响应对象: Node.js提供的响应对象

  // 3. 其他属性
  console.log(ctx.query); // 获取请求参数
  console.log(ctx.querystring); // 获取请求参数字符串

  next();
});

app.use((ctx, next) => {
  console.log("second middleware~");
});

app.listen(6000, () => {
  console.log("koa server is running~");
});
